library(here)
here() starts at /Users/maarten/Documents/projects/mbo-rekenen
library(data.table)
Warning: package 'data.table' was built under R version 4.3.3
library(ggplot2)
library(jsonlite)
library(purrr)
Attaching package: 'purrr'
The following object is masked from 'package:jsonlite':
flatten
The following object is masked from 'package:data.table':
transpose
library(tidytext)
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:data.table':
between, first, last
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(wordcloud2)
theme_memorylab_url <- "https://raw.githubusercontent.com/SlimStampen/theme_memorylab/master/theme_memorylab.R"
source(theme_memorylab_url)
Evaluation questions
Students answered a number of evaluation questions after the
posttest.
Hoe koos je welke les je ging doen?
q1 <- fread(here("data", "feedback", "q1_choice.csv"))
q1[, freq := Totaal / sum(Totaal)]
q1
ggplot(q1, aes(x = reorder(Antwoord, freq), y = freq)) +
geom_col(fill = colours_memorylab[1]) +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "Hoe koos je welke les je ging doen?",
x = NULL,
y = NULL) +
coord_flip() +
theme_ml() +
theme(panel.grid.major.x = element_line(colour = "grey90"))
Loading required package: showtext
Loading required package: sysfonts
Loading required package: showtextdb
Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
ℹ Please use the `linewidth` argument instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

ggsave(here("output", "evaluatie_leskeuze.png"), width = 10, height = 4)
What proportion of students made a choice based on difficulty?
q1[1:3, sum(freq)]
[1] 0.606383
Bij welk onderwerp vond je MemoryLab het meest toevoegen?
q2 <- fread(here("data", "feedback", "q2_topic.csv"), header = TRUE)
q2_long <- melt(q2, measure.vars = 2:12, variable.name = "positie", value.name = "N")
q2_long[, positie := as.numeric(positie)]
# Calculate the average position by topic
q2_rank <- q2_long[, .(mean_rank = weighted.mean(positie, N)), by = "topic"]
ggplot(q2_rank, aes(x = reorder(topic, -mean_rank), y = mean_rank)) +
geom_col(fill = colours_memorylab[1]) +
labs(title = "Bij welk onderwerp vond je MemoryLab het meest toevoegen?",
x = NULL,
y = "Gemiddelde rang (lager is beter)") +
coord_flip() +
theme_ml() +
theme(panel.grid.major.x = element_line(colour = "grey90"))

ggsave(here("output", "evaluatie_onderwerp.png"), width = 10, height = 4)
Geef MemoryLab een cijfer
q3 <- fread(here("data", "feedback", "q3_grade.csv"))
q3[, freq := Totaal / sum(Totaal)]
# Mean grade
q3[, weighted.mean(grade, Totaal)]
[1] 6.561224
# What proportion of students gave a passing grade?
q3[grade >= 6, sum(freq)]
[1] 0.8265306
ggplot(q3, aes(x = grade, y = freq)) +
geom_col(fill = colours_memorylab[1]) +
scale_x_continuous(breaks = 1:10) +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "Geef MemoryLab een cijfer",
x = "Cijfer",
y = NULL) +
theme_ml()

ggsave(here("output", "evaluatie_cijfer.png"), width = 10, height = 4)
Zou je deze leermethode ook willen gebruiken voor andere
rekenlesstof?
q4 <- fread(here("data", "feedback", "q4_useother.csv"))
q4[, freq := Totaal / sum(Totaal)]
q4
Wat vond je fijn aan het oefenen met MemoryLab?
stop_words <- get_stopwords(language = "nl")
# Read text file
q1 <- readLines(here("data", "feedback", "Q_watvondjefijn.txt"))
q1_words <- tibble(answer = tolower(q1)) |>
unnest_tokens(word, answer) |>
anti_join(stop_words, by = "word") |>
count(word, sort = TRUE)
# Make wordcloud
wordcloud2(q1_words,
shuffle = FALSE,
minSize = 4,
size = 4,
rotateRatio = .4
)
# Take screenshot of viewer to save

Wat vond je niet fijn aan het oefenen met MemoryLab?
q2 <- readLines(here("data", "feedback", "Q_watvondjenietfijn.txt"))
q2_words <- tibble(answer = tolower(q2)) |>
unnest_tokens(word, answer) |>
anti_join(stop_words, by = "word") |>
count(word, sort = TRUE)
# Make wordcloud
wordcloud2(q2_words,
shuffle = FALSE,
minSize = 4,
size = 4,
rotateRatio = .4
)
# Take screenshot of viewer to save

LS0tCnRpdGxlOiAiRXZhbHVhdGlvbiIKc3VidGl0bGU6ICJNQk9pbjIwMzAiCmF1dGhvcjogIk1hYXJ0ZW4gdmFuIGRlciBWZWxkZSIKZGF0ZTogIkxhc3QgdXBkYXRlZDogYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgc21hcnQ6IG5vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQotLS0KCmBgYHtyfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGpzb25saXRlKQpsaWJyYXJ5KHB1cnJyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHdvcmRjbG91ZDIpCgp0aGVtZV9tZW1vcnlsYWJfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vU2xpbVN0YW1wZW4vdGhlbWVfbWVtb3J5bGFiL21hc3Rlci90aGVtZV9tZW1vcnlsYWIuUiIKc291cmNlKHRoZW1lX21lbW9yeWxhYl91cmwpCmBgYAoKIyBFdmFsdWF0aW9uIHF1ZXN0aW9ucwoKU3R1ZGVudHMgYW5zd2VyZWQgYSBudW1iZXIgb2YgZXZhbHVhdGlvbiBxdWVzdGlvbnMgYWZ0ZXIgdGhlIHBvc3R0ZXN0LgoKIyMgSG9lIGtvb3MgamUgd2Vsa2UgbGVzIGplIGdpbmcgZG9lbj8KYGBge3J9CnExIDwtIGZyZWFkKGhlcmUoImRhdGEiLCAiZmVlZGJhY2siLCAicTFfY2hvaWNlLmNzdiIpKQpxMVssIGZyZXEgOj0gVG90YWFsIC8gc3VtKFRvdGFhbCldCgpxMQoKZ2dwbG90KHExLCBhZXMoeCA9IHJlb3JkZXIoQW50d29vcmQsIGZyZXEpLCB5ID0gZnJlcSkpICsKICBnZW9tX2NvbChmaWxsID0gY29sb3Vyc19tZW1vcnlsYWJbMV0pICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgbGFicyh0aXRsZSA9ICJIb2Uga29vcyBqZSB3ZWxrZSBsZXMgamUgZ2luZyBkb2VuPyIsCiAgICAgICB4ID0gTlVMTCwKICAgICAgIHkgPSBOVUxMKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9tbCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5MCIpKQoKZ2dzYXZlKGhlcmUoIm91dHB1dCIsICJldmFsdWF0aWVfbGVza2V1emUucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDQpCmBgYApXaGF0IHByb3BvcnRpb24gb2Ygc3R1ZGVudHMgbWFkZSBhIGNob2ljZSBiYXNlZCBvbiBkaWZmaWN1bHR5PwpgYGB7cn0KcTFbMTozLCBzdW0oZnJlcSldCmBgYAoKCgojIyBCaWogd2VsayBvbmRlcndlcnAgdm9uZCBqZSBNZW1vcnlMYWIgaGV0IG1lZXN0IHRvZXZvZWdlbj8KCmBgYHtyfQpxMiA8LSBmcmVhZChoZXJlKCJkYXRhIiwgImZlZWRiYWNrIiwgInEyX3RvcGljLmNzdiIpLCBoZWFkZXIgPSBUUlVFKQpxMl9sb25nIDwtIG1lbHQocTIsIG1lYXN1cmUudmFycyA9IDI6MTIsIHZhcmlhYmxlLm5hbWUgPSAicG9zaXRpZSIsIHZhbHVlLm5hbWUgPSAiTiIpCnEyX2xvbmdbLCBwb3NpdGllIDo9IGFzLm51bWVyaWMocG9zaXRpZSldCgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBwb3NpdGlvbiBieSB0b3BpYwpxMl9yYW5rIDwtIHEyX2xvbmdbLCAuKG1lYW5fcmFuayA9IHdlaWdodGVkLm1lYW4ocG9zaXRpZSwgTikpLCBieSA9ICJ0b3BpYyJdCgpnZ3Bsb3QocTJfcmFuaywgYWVzKHggPSByZW9yZGVyKHRvcGljLCAtbWVhbl9yYW5rKSwgeSA9IG1lYW5fcmFuaykpICsKICBnZW9tX2NvbChmaWxsID0gY29sb3Vyc19tZW1vcnlsYWJbMV0pICsKICBsYWJzKHRpdGxlID0gIkJpaiB3ZWxrIG9uZGVyd2VycCB2b25kIGplIE1lbW9yeUxhYiBoZXQgbWVlc3QgdG9ldm9lZ2VuPyIsCiAgICAgICB4ID0gTlVMTCwKICAgICAgIHkgPSAiR2VtaWRkZWxkZSByYW5nIChsYWdlciBpcyBiZXRlcikiKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9tbCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5MCIpKQoKZ2dzYXZlKGhlcmUoIm91dHB1dCIsICJldmFsdWF0aWVfb25kZXJ3ZXJwLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA0KQpgYGAKCiMjIEdlZWYgTWVtb3J5TGFiIGVlbiBjaWpmZXIKCmBgYHtyfQpxMyA8LSBmcmVhZChoZXJlKCJkYXRhIiwgImZlZWRiYWNrIiwgInEzX2dyYWRlLmNzdiIpKQpxM1ssIGZyZXEgOj0gVG90YWFsIC8gc3VtKFRvdGFhbCldCgojIE1lYW4gZ3JhZGUKcTNbLCB3ZWlnaHRlZC5tZWFuKGdyYWRlLCBUb3RhYWwpXQoKIyBXaGF0IHByb3BvcnRpb24gb2Ygc3R1ZGVudHMgZ2F2ZSBhIHBhc3NpbmcgZ3JhZGU/CnEzW2dyYWRlID49IDYsIHN1bShmcmVxKV0KCmdncGxvdChxMywgYWVzKHggPSBncmFkZSwgeSA9IGZyZXEpKSArCiAgZ2VvbV9jb2woZmlsbCA9IGNvbG91cnNfbWVtb3J5bGFiWzFdKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgbGFicyh0aXRsZSA9ICJHZWVmIE1lbW9yeUxhYiBlZW4gY2lqZmVyIiwKICAgICAgIHggPSAiQ2lqZmVyIiwKICAgICAgIHkgPSBOVUxMKSArCiAgdGhlbWVfbWwoKQoKZ2dzYXZlKGhlcmUoIm91dHB1dCIsICJldmFsdWF0aWVfY2lqZmVyLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA0KQpgYGAKCiMjIFpvdSBqZSBkZXplIGxlZXJtZXRob2RlIG9vayB3aWxsZW4gZ2VicnVpa2VuIHZvb3IgYW5kZXJlIHJla2VubGVzc3RvZj8KYGBge3J9CnE0ICA8LSBmcmVhZChoZXJlKCJkYXRhIiwgImZlZWRiYWNrIiwgInE0X3VzZW90aGVyLmNzdiIpKQpxNFssIGZyZXEgOj0gVG90YWFsIC8gc3VtKFRvdGFhbCldCnE0CmBgYAoKIyMgV2F0IHZvbmQgamUgZmlqbiBhYW4gaGV0IG9lZmVuZW4gbWV0IE1lbW9yeUxhYj8KYGBge3IgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0Kc3RvcF93b3JkcyA8LSBnZXRfc3RvcHdvcmRzKGxhbmd1YWdlID0gIm5sIikKCiMgUmVhZCB0ZXh0IGZpbGUgCnExIDwtIHJlYWRMaW5lcyhoZXJlKCJkYXRhIiwgImZlZWRiYWNrIiwgIlFfd2F0dm9uZGplZmlqbi50eHQiKSkKCnExX3dvcmRzIDwtIHRpYmJsZShhbnN3ZXIgPSB0b2xvd2VyKHExKSkgfD4KICB1bm5lc3RfdG9rZW5zKHdvcmQsIGFuc3dlcikgfD4KICBhbnRpX2pvaW4oc3RvcF93b3JkcywgYnkgPSAid29yZCIpIHw+CiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpCgojIE1ha2Ugd29yZGNsb3VkCndvcmRjbG91ZDIocTFfd29yZHMsCiAgICAgICAgICAgc2h1ZmZsZSA9IEZBTFNFLAogICAgICAgICAgIG1pblNpemUgPSA0LAogICAgICAgICAgIHNpemUgPSA0LAogICAgICAgICAgIHJvdGF0ZVJhdGlvID0gLjQKICAgICAgICAgICApCiMgVGFrZSBzY3JlZW5zaG90IG9mIHZpZXdlciB0byBzYXZlCmBgYAoKIVtdKC4uL291dHB1dC93b3JkY2xvdWRfZmlqbi5wbmcpCgoKIyMgV2F0IHZvbmQgamUgbmlldCBmaWpuIGFhbiBoZXQgb2VmZW5lbiBtZXQgTWVtb3J5TGFiPwpgYGB7ciBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQpxMiA8LSByZWFkTGluZXMoaGVyZSgiZGF0YSIsICJmZWVkYmFjayIsICJRX3dhdHZvbmRqZW5pZXRmaWpuLnR4dCIpKQoKcTJfd29yZHMgPC0gdGliYmxlKGFuc3dlciA9IHRvbG93ZXIocTIpKSB8PgogIHVubmVzdF90b2tlbnMod29yZCwgYW5zd2VyKSB8PgogIGFudGlfam9pbihzdG9wX3dvcmRzLCBieSA9ICJ3b3JkIikgfD4KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkKCiMgTWFrZSB3b3JkY2xvdWQKd29yZGNsb3VkMihxMl93b3JkcywKICAgICAgICAgICBzaHVmZmxlID0gRkFMU0UsCiAgICAgICAgICAgbWluU2l6ZSA9IDQsCiAgICAgICAgICAgc2l6ZSA9IDQsCiAgICAgICAgICAgcm90YXRlUmF0aW8gPSAuNAopCiMgVGFrZSBzY3JlZW5zaG90IG9mIHZpZXdlciB0byBzYXZlCmBgYAoKIVtdKC4uL291dHB1dC93b3JkY2xvdWRfbmlldGZpam4ucG5nKQ==